using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;
using System.Data;

namespace EntGuayasSLA.BL
{
    [Serializable]
    public class Usuarios : BusinessBase<Usuarios>
    {
        #region Business Methods

        public static readonly PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(p => p.Id);
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }
        public static readonly PropertyInfo<string> PersonaIdProperty = RegisterProperty<string>(c => c.PersonaId);
        public string PersonaId
        {
            get { return GetProperty(PersonaIdProperty); }
            set { SetProperty(PersonaIdProperty, value); }
        }
        public static readonly PropertyInfo<string> RolIdProperty = RegisterProperty<string>(c => c.RolId);
        public string RolId
        {
            get { return GetProperty(RolIdProperty); }
            set { SetProperty(RolIdProperty, value); }
        }
        public static readonly PropertyInfo<string> LoginProperty = RegisterProperty<string>(c => c.Login);
        public string Login
        {
            get { return GetProperty(LoginProperty); }
            set { SetProperty(LoginProperty, value); }
        }

        public static readonly PropertyInfo<string> ClaveProperty = RegisterProperty<string>(c => c.Clave);
        public string Clave
        {
            get { return GetProperty(ClaveProperty); }
            set { SetProperty(ClaveProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaCreacionProperty = RegisterProperty<DateTime>(c => c.FechaCreacion);
        public DateTime FechaCreacion
        {
            get { return GetProperty(FechaCreacionProperty); }
            set { SetProperty(FechaCreacionProperty, value); }
        }

        public static readonly PropertyInfo<string> EstadoProperty = RegisterProperty<string>(c => c.Estado);
        public string Estado
        {
            get { return GetProperty(EstadoProperty); }
            set { SetProperty(EstadoProperty, value); }
        }
        public static readonly PropertyInfo<string> RolCodigoProperty = RegisterProperty<string>(c => c.RolCodigo);
        public string RolCodigo
        {
            get { return GetProperty(RolCodigoProperty); }
            set { SetProperty(RolCodigoProperty, value); }
        }
        public static readonly PropertyInfo<string> RolNombreProperty = RegisterProperty<string>(c => c.RolNombre);
        public string RolNombre
        {
            get { return GetProperty(RolNombreProperty); }
            set { SetProperty(RolNombreProperty, value); }
        }
        #endregion

        #region Business Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            base.AddBusinessRules();

            //BusinessRules.AddRule(new Rule(IdProperty));
        }

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //BusinessRules.AddRule(...);
        }

        #endregion

        #region Factory Methods
        [Serializable()]
        private class UsuarioCriteria
        {
            private string _usuario;
            public string Usuario
            {
                get { return _usuario; }
            }
            private string _clave;
            public string Clave
            {
                get { return _clave; }
            }
            public UsuarioCriteria(string usuario, string clave)
            {
                _usuario = usuario;
                _clave = clave;
            }
        }
        public static int VerificarLogin(string txtUsuario,string id)
        {
            return ExisteUsuarioCommand.Execute(txtUsuario,id);
        }
        public static Usuarios NewEditableRoot()
        {
            return DataPortal.Create<Usuarios>();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static Usuarios GetEditableRoot(Guid idPersona)
        {
            return DataPortal.Fetch<Usuarios>(idPersona);
        }
        public static Usuarios GetEditableRoot(string id)
        {
            return DataPortal.Fetch<Usuarios>(id);
        }
        public static Usuarios GetEditableRoot(string usuario,string clave)
        {
            return DataPortal.Fetch<Usuarios>(new UsuarioCriteria(usuario, clave));
        }
        public static void DeleteEditableRoot(int id)
        {
            DataPortal.Delete<Usuarios>(id);
        }

        private Usuarios()
        { /* Require use of factory methods */ }

        #endregion

        #region Data Access

        [RunLocal]
        protected override void DataPortal_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.DataPortal_Create();
        }
        private void SetProperty(DataSet datos)
        {
            LoadProperty(IdProperty, Guid.Parse(datos.Tables[0].Rows[0][0].ToString()));
            LoadProperty(PersonaIdProperty, datos.Tables[0].Rows[0][1].ToString());
            LoadProperty(RolIdProperty, datos.Tables[0].Rows[0][2].ToString());
            LoadProperty(LoginProperty, datos.Tables[0].Rows[0][3].ToString());
            LoadProperty(ClaveProperty, datos.Tables[0].Rows[0][4].ToString());
            LoadProperty(FechaCreacionProperty, Convert.ToDateTime(datos.Tables[0].Rows[0][5].ToString()));
            LoadProperty(EstadoProperty, datos.Tables[0].Rows[0][6].ToString());
            LoadProperty(RolCodigoProperty, datos.Tables[0].Rows[0][7].ToString());
            LoadProperty(RolNombreProperty, datos.Tables[0].Rows[0][8].ToString());
        }
        private void DataPortal_Fetch(string criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { new Parametro("ec_usr_id", criteria) };
            DataSet datos = accesoDatos.EjecutarDataSet("\"OBT_USUARIO\"", parametros);
            if (datos.Tables[0].Rows.Count > 0)
            {
                SetProperty(datos);
            }
            else
            {
                LoadProperty(EstadoProperty,"");
            }
        }

        //
        private void DataPortal_Fetch(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { new Parametro("ec_per_id", criteria.ToString()) };
            DataSet datos = accesoDatos.EjecutarDataSet("\"OBT_USUARIO_PER\"", parametros);
            if (datos.Tables[0].Rows.Count > 0)
            {
                SetProperty(datos);
            }
            else
            {
                LoadProperty(EstadoProperty, "");
            }
        }
        private void DataPortal_Fetch(UsuarioCriteria criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { new Parametro("ec_usr_login", criteria.Usuario), new Parametro("ec_usr_clave", criteria.Clave) };
            DataSet datos = accesoDatos.EjecutarDataSet("\"OBT_USUARIO_LOGIN\"", parametros);
            if (datos.Tables[0].Rows.Count > 0)
            {
                SetProperty(datos);

            }
            else
            {
                LoadProperty(EstadoProperty, "");
            }
        }
        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        { 
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_usr_id", ReadProperty(IdProperty)),
                new Parametro("ec_per_id", ReadProperty(PersonaIdProperty)),
                new Parametro("ec_rol_id", ReadProperty(RolIdProperty)),
                new Parametro("ec_usr_login", ReadProperty(LoginProperty)),
                new Parametro("ec_usr_clave", ReadProperty(ClaveProperty)),
                new Parametro("ef_usr_fecha_creacion", ReadProperty(FechaCreacionProperty)),
                new Parametro("ec_usr_estado", ReadProperty(EstadoProperty))
            };
            accesoDatos.EjecutarQuery("\"INS_USUARIO\"", parametros);
            
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_usr_id", ReadProperty(IdProperty)),
                new Parametro("ec_per_id", ReadProperty(PersonaIdProperty)),
                new Parametro("ec_rol_id", ReadProperty(RolIdProperty)),
                new Parametro("ec_usr_login", ReadProperty(LoginProperty)),
                new Parametro("ec_usr_clave", ReadProperty(ClaveProperty)),
                new Parametro("ef_usr_fecha_creacion", ReadProperty(FechaCreacionProperty)),
                new Parametro("ec_usr_estado", ReadProperty(EstadoProperty))
            };
            accesoDatos.EjecutarQuery("\"ACT_USUARIO\"", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            DataPortal_Delete(this.Id);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_usr_id", criteria.ToString())
            };
            accesoDatos.EjecutarQuery("\"ELI_USUARIO\"", parametros);
        }

        #endregion
    }
    [Serializable]
    public class ExisteUsuarioCommand : CommandBase<ExisteUsuarioCommand>
    {
        private string _usuario;
        private string _id;
        #region Authorization Methods

        public static bool CanExecuteCommand()
        {
            // TODO: customize to check user role
            //return Csla.ApplicationContext.User.IsInRole("Role");
            return true;
        }

        #endregion

        #region Factory Methods

        public static int Execute(string usuario,string id)
        {
            if (!CanExecuteCommand())
                throw new System.Security.SecurityException("Not authorized to execute command");

            ExisteUsuarioCommand cmd = new ExisteUsuarioCommand(usuario,id);
            cmd.BeforeServer();
            cmd = DataPortal.Execute<ExisteUsuarioCommand>(cmd);
            cmd.AfterServer();
            return cmd.Result;
        }

        private ExisteUsuarioCommand(string usuario,string id)
        { /* require use of factory methods */
            _usuario = usuario;
            _id = id;
            _result = 0;
        }

        #endregion

        #region Client-side Code

        // TODO: add your own fields and properties
        int _result;

        public int Result
        {
            get { return _result; }
        }

        private void BeforeServer()
        {
            // TODO: implement code to run on client
            // before server is called
        }

        private void AfterServer()
        {
            // TODO: implement code to run on client
            // after server is called
        }

        #endregion

        #region Server-side Code

        protected override void DataPortal_Execute()
        {
            int numeroUsuario = 0; object valret;
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { new Parametro("ec_usr_id", _usuario),
            new Parametro("ec_per_id", _id)};
            try
            {
               
                valret = accesoDatos.EjecutarScalar("\"CMD_COMPROBAR_LOGIN\"", parametros);
              
                int.TryParse(valret.ToString(), out numeroUsuario);
                _result = numeroUsuario;
               
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
